package ar.com.jsejtman.cajugastos2.core.entity;

import ar.com.jsejtman.common.domain.entity.Identifiable;
import java.util.HashSet;
import java.util.Set;
import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.OneToMany;
import javax.persistence.Table;
import javax.persistence.Version;

/**
 * Categoria del gasto.
 * 
 * @author jsejtman
 * 
 */
@Entity
@Table(name = "CATEGORIAS")
public class Categoria implements Identifiable<Long> {

	/**
	 * Identificador.
	 */
	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	@Column(name = "id")
	private Long id;
	/**
	 * Descripción.
	 */
	@Column(name = "DESCRIPCION", unique = true, nullable = false)
	private String descripcion;
	/**
	 * Gastos de la categoría.
	 */
	@ElementCollection(targetClass = Gasto.class, fetch = FetchType.LAZY)
	private Set<Gasto> gastos;
	/**
	 * Lugares de la categoría.
	 */
	@OneToMany(mappedBy = "categoria", fetch = FetchType.LAZY, cascade = CascadeType.ALL,
	           orphanRemoval = false)
	private Set<Lugar> lugares;

	/**
	 * Subcategorias de la categoría.
	 */
	@OneToMany(mappedBy = "categoria", fetch = FetchType.LAZY, cascade = CascadeType.ALL,
	           orphanRemoval = false)
	private Set<Subcategoria> subcategorias;

	/**
	 * Versión de la entidad.
	 */
	@Column(name = "VERSION")
	@Version
	private Long version;

	/**
	 * Setter de gastos.
	 * 
	 * @param gastos the gastos to set
	 */
	protected final void setGastos(final Set<Gasto> gastos) {

		this.gastos = gastos;
	}

	/**
	 * Agrega un gasto.
	 * 
	 * @param gasto el gasto.
	 */
	public final void addGasto(final Gasto gasto) {

		if (this.gastos == null) {
			this.gastos = new HashSet<Gasto>();
		}
		this.gastos.add(gasto);
		gasto.setCategoria(this);
	}

	/**
	 * Devuelve el valor de id.
	 * 
	 * @return El valor de id.
	 */
	public final Long getId() {

		return this.id;
	}

	/**
	 * Asigna un nuevo valor a id.
	 * 
	 * @param id El valor a asignar a id.
	 */
	public final void setId(final Long id) {

		this.id = id;
	}

	/**
	 * Devuelve el valor de descripcion.
	 * 
	 * @return El valor de descripcion.
	 */
	public final String getDescripcion() {

		return this.descripcion;
	}

	/**
	 * Asigna un nuevo valor a descripcion.
	 * 
	 * @param descripcion El valor a asignar a descripcion.
	 */
	public final void setDescripcion(final String descripcion) {

		this.descripcion = descripcion;
	}

	/**
	 * Devuelve el valor de lugares.
	 * 
	 * @return El valor de lugares.
	 */
	public final Set<Lugar> getLugares() {

		return this.lugares;
	}

	/**
	 * Asigna un nuevo valor a lugares.
	 * 
	 * @param lugares El valor a asignar a lugares.
	 */
	public final void setLugares(final Set<Lugar> lugares) {

		this.lugares = lugares;
	}

	/**
	 * Devuelve el valor de subcategorias.
	 * 
	 * @return El valor de subcategorias.
	 */
	public final Set<Subcategoria> getSubcategorias() {

		return this.subcategorias;
	}

	/**
	 * Asigna un nuevo valor a subcategorias.
	 * 
	 * @param subcategorias El valor a asignar a subcategorias.
	 */
	public final void setSubcategorias(final Set<Subcategoria> subcategorias) {

		this.subcategorias = subcategorias;
	}

	/**
	 * Devuelve el valor de version.
	 * 
	 * @return El valor de version.
	 */
	public final Long getVersion() {

		return this.version;
	}

	/**
	 * Asigna un nuevo valor a version.
	 * 
	 * @param version El valor a asignar a version.
	 */
	public final void setVersion(final Long version) {

		this.version = version;
	}

	/**
	 * Devuelve el valor de gastos.
	 * 
	 * @return El valor de gastos.
	 */
	public final Set<Gasto> getGastos() {

		return this.gastos;
	}

}
